#include "CustomSortFilterProxyModel.h"

CustomSortFilterProxyModel::CustomSortFilterProxyModel(QObject *parent)
    : QSortFilterProxyModel{parent}
{}


bool CustomSortFilterProxyModel::lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const
{
    QVariant leftData = sourceModel()->data(source_left);
    QVariant rightData = sourceModel()->data(source_right);


    QString leftString = leftData.toString();
    QString rightString = rightData.toString();
    // 检查是否以大写字母 "F" 开头
    if (leftString.startsWith("F") && rightString.startsWith("F")) {
        // 提取数字部分
        int leftNumber = extractNumber(leftString);
        int rightNumber = extractNumber(rightString);

        return leftNumber < rightNumber;
    } else {
        // 默认的字符串排序
        return QString::compare(leftString, rightString,Qt::CaseInsensitive) < 0;
    }
}

/**
     * 追加headerData函数
     * @brief headerData
     * @param section
     * @param orientation
     * @param role
     * @return
     */
QVariant CustomSortFilterProxyModel::headerData(int section, Qt::Orientation orientation, int role) const
{
    //如果是垂直表头，不到sourcemodel（数据model里面去找了），因为找数据model里面就是数据model的行号。所以才会跟着变化。
    if(Qt::Vertical == orientation && Qt::DisplayRole == role) {
        return QString::number(section +1);    //section是从0开始的
    }
    //其他表头的内容还是从sourcemodel去找
    return sourceModel()->headerData(section,orientation,role);

    //DisplayRole 是 QAbstractItemModel 类中的一个枚举值，用于指定数据项的显示角色。每个数据项可以有多个角色，每个角色对应不同的数据类型或用途。DisplayRole 是最常用的角色之一，用于提供数据项的文本显示内容。
    //
    if (role != Qt::DisplayRole)
        return QSortFilterProxyModel::headerData(section, orientation, role);

    //水平
    if(orientation == Qt::Horizontal){
        switch(section){
        case 0:
            return "序号";
        case 1:
            return "参数";
        case 2:
            return "快捷项";
        case 3:
            return "快捷名称";
        case 4:
            return "命令行";
        default:
            // return "";
            return QSortFilterProxyModel::headerData(section, orientation, role);
        }
    } else if (orientation == Qt::Vertical) {
        // 自定义垂直表头
        return QString("Row %1").arg(section);
    }else{
        return QString("%1").arg(section + 1);
    }
    return QSortFilterProxyModel::headerData(section, orientation, role);
}


int CustomSortFilterProxyModel::extractNumber(const QString &str) const
{
    // 假设字符串格式为 "F<数字>"
    QString numberPart = str.mid(1); // 从第二个字符开始提取数字部分
    return numberPart.toInt();
}
